//
//  UserAccountViewModel.swift
//  weibo
//
//  Created by yellow on 15/10/18.
//  Copyright © 2015年 yellow. All rights reserved.
//

import UIKit


/// ViewModel只封装view中的业务逻辑，只为view工作，从网络层获取数据，相当于3层架构中的serviece层
class UserAccountViewModel {
    
    //viewModel中调用微博API的接口
    private lazy var weiboAPIManager = WeiboAPIManager.manager
    
     /// 单例 - 解决避免重复从沙盒加载 归档 文件，提高效率，让 access_token 便于被访问到
    static var sharedViewModel = UserAccountViewModel()
    
    var account:UserAccount?
    
    /// 构造函数 － 私有化，会要求外部只能通过单例常量访问，而不能 () 实例化
    private init() {
        var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
        path = (path as NSString).stringByAppendingPathComponent("account.plist")
        account = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? UserAccount
    }

    //判断是否token过期
    private var isExpired:Bool{
        
        //如果token有效日期大于当前日期
        if account?.availableDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            return false
        }else{
            return true
        }
    }
    
    
    /// 归档保存的路径 - 计算型属性(类似于有返回值的函数，可以让调用的时候，语义会更清晰)
    /// 如果在 OC 中，可以通过只读属性／函数的方式实现
    private var accountFilePath: String {
        
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
}


// MARK: - 对外开计算型属性
extension UserAccountViewModel{
    
    //判断是否为登录用户
    var isLoginUser:Bool{
        // 1. 如果 token 有值，说明登录过
        // 2. 如果没有过期，说明登录有效
        if let _ = account?.access_token where isExpired == false {
            //print("当前token有效")
            return true
        }
        print("当前token失效")
        return false
    }
    
    //如果在有效期返回token，否则返回nil
    var userToken:String?{
        if isExpired == false{
            return account?.access_token
        }else{
            return nil
        }
    }
    
    //返回用户头像的URL
    var userIconURL:NSURL?{
       return NSURL(string: (account?.avatar_large)!)
    }
    
    /// 获取微博名
    var userScreen_name:String?{
        return account?.screen_name
    }
}

// MARK: - 对外开放方法
extension UserAccountViewModel{
    
    /// 获取用户token，根据code
    ///
    /// - parameter code: 换取token的code
    func getAccessTokenByCode(code:String,finised:(isSuccess:Bool) -> ()){
        weiboAPIManager.getUersToken(code) { (result, error) -> (Void) in
            if error != nil {
                finised(isSuccess:false)
            }else{
                self.account = UserAccount(dict: result as! [String: AnyObject])
                //根据token获取用户信息
                self.getUserInfo(self.account!, finished: finised)
            }
        }
        
    }


    
}

// MARK: - 私有方法
extension UserAccountViewModel{
    //获取用户信息
    private func getUserInfo(account:UserAccount,finished:(isSuccess:Bool)->()){
        weiboAPIManager.loadUserInfo(account.uid!) { (result, error) -> (Void) in
            if error != nil {
                finished(isSuccess: false)
            }else{
                //守卫result有值，且为[String:AnyObject]这种格式的字典
                guard let dict = result as? [String:AnyObject] else{
                    return
                }
                
                account.screen_name = dict["screen_name"] as? String
                account.avatar_large = dict["avatar_large"] as? String
                //将用户信息保存到沙盒中
                NSKeyedArchiver.archiveRootObject(account, toFile: self.accountFilePath)
                finished(isSuccess: true)
            }
        }
    }
}


